home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / tex / dvi / dvipssrc.zoo / atari / flib.c < prev    next >
C/C++ Source or Header  |  1991-04-27  |  10KB  |  323 lines

  1. /*
  2.  *   Here's some code to handle font libraries.  Not needed unless you are
  3.  *   running on a system that can't handle files well.  Not endorsed by
  4.  *   Tomas Rokicki or Radical Eye Software; use at your own risk.
  5.  */
  6.  
  7. /*   Modified for the Atari ST by Tim Gallivan 4/27/91  */
  8.  
  9. #ifdef FONTLIB
  10. #include "structures.h"
  11. #include "paths.h"
  12. extern FILE *search() ;
  13. extern char *newstring() ;
  14. extern shalfword pkbyte() ;
  15. extern void badpk() ;
  16. extern char *malloc() ;
  17. extern integer pkquad() ;
  18. extern int debug_flag ;
  19. extern char errbuf[] ;
  20. extern char *flipath ;
  21. extern char *fliname ;
  22. extern FILE *pkfile ;
  23. /*
  24.  * font library structures
  25.  */
  26. struct fli_entry {
  27.    unsigned long  offset;
  28.    char          *name;
  29. };
  30.  
  31. struct fli_size {
  32.    unsigned long     size;
  33.    halfword          entries;
  34.    struct fli_entry *entry;
  35. };
  36.  
  37. struct fli_lib {
  38.    char            *name;
  39.    FILE            *fp;
  40.    halfword         sizes;
  41.    struct fli_size *size;
  42.    struct fli_lib  *next;
  43. };
  44.  
  45. struct fli_lib *firstlib = NULL;
  46.  
  47. Boolean flib = 0;  /* non zero if reading a font library */
  48.  
  49. halfword
  50. pkdouble()
  51. {
  52.    register halfword i ;
  53.    i = pkbyte() ;
  54.    i = i * 256 + pkbyte() ;
  55.    return(i) ;
  56. }
  57. extern char name[] ;
  58. /*
  59.  *   fliload opens each font library, then reads in its
  60.  *   directory for later use.  Font libraries are left
  61.  *   open for later use by flisearch().
  62.  *   loadfont() does not close pkfile if it is a font 
  63.  *   library (flib non zero).
  64.  */
  65. void
  66. fliload()
  67. {
  68.    int i ;
  69.    halfword version1, version2;
  70.    Boolean needext;
  71.    char fontname[50]; 
  72.    char name[50] ;
  73.    char *fli;
  74.    unsigned long dpi;
  75.    halfword len, numsizes, numfonts;
  76.    struct fli_lib *lib=NULL, *next_lib=NULL;
  77.    struct fli_size *size;
  78.    struct fli_entry *entry;
  79.  
  80.    fli = fliname;
  81.  
  82.    while (*fli) {
  83.       /* get next font library name from fliname */
  84.       needext=1;
  85. #ifdef atarist
  86.       for (i=0; *fli && *fli != PATHSEP && *fli != PATHSEP2; i++)
  87. #else
  88.       for (i=0; *fli && *fli!=PATHSEP; i++)
  89. #endif
  90.          if ( (name[i] = *fli++) == '.')
  91.             needext=0;
  92.       name[i] = '\0';
  93.       if (*fli)
  94.          fli++;  /* skip PATHSEP */
  95.       if (*name) { 
  96.          /* got fli name, now search for it */
  97.          if (needext)
  98.             strcat(name,".fli");
  99.  
  100.          if ( (pkfile=search(flipath,name,READBIN)) != (FILE *)NULL ) {
  101.             /* for each font library */
  102.             for (i=0; i<4; i++) {
  103.               fontname[i] = pkbyte();  /* read header */
  104.             }
  105.             version1 = pkbyte();
  106.             version2 = pkbyte();
  107.             if (strncmp(fontname,"FLIB",4)!=0 || version1 != 2 || version2 != 0)
  108.                badpk("incorrect font library format");
  109.  
  110.             (void) pkdouble();       /* ignore directory length */
  111.             numsizes = pkdouble();   /* number of sizes */
  112.             numfonts = pkdouble();   /* number of fonts */
  113.             len = pkdouble();        /* length of comment */
  114.             for (i=0; i<len; i++)
  115.                (void)pkbyte();       /* skip comment */
  116. #ifdef DEBUG
  117.    if (dd(D_FONTS))
  118.       (void)fprintf(stderr,"Font library %s has %d font size%s, %d font%s\n",
  119.          name, numsizes , numsizes !=1 ? "s" : "", 
  120.          numfonts, numfonts!=1 ? "s" : "");
  121. #endif /* DEBUG */
  122.  
  123.             next_lib =  (struct fli_lib *)malloc(sizeof(struct fli_lib)); 
  124.             if (next_lib == (struct fli_lib *)NULL)
  125.                error("! out of memory while reading font library") ;
  126.             if (firstlib == (struct fli_lib *)NULL)
  127.                firstlib = next_lib;
  128.             else
  129.                lib->next = next_lib;
  130.             lib = next_lib;
  131.             size = (struct fli_size *)
  132.                         malloc(numsizes * sizeof(struct fli_size)); 
  133.             if (size == (struct fli_size *)NULL)
  134.                error("! out of memory while reading font library") ;
  135.             entry = (struct fli_entry *)
  136.                         malloc(numfonts * sizeof(struct fli_entry)); 
  137.             if (entry == (struct fli_entry *)NULL)
  138.                error("! out of memory while reading font library") ;
  139.             lib->name = newstring(name);
  140.             lib->fp = pkfile;         /* keep file open */
  141.             lib->sizes = numsizes;
  142.             lib->size = size;
  143.             lib->next = (struct fli_lib *)NULL;
  144.  
  145.             for ( ;numsizes>0; numsizes--, size++) { 
  146.                /* for each font size in this library */
  147.                (void)pkdouble();      /* length of size entry - ignore */
  148.                numfonts = pkdouble(); /* number of fonts */
  149.                dpi = pkquad();        /* DPI (fixed point 16.16) */
  150.  
  151. #ifdef DEBUG
  152.    if (dd(D_FONTS))
  153.       (void)fprintf(stderr,"Font library %s size %.5gdpi has %d font%s\n", 
  154.                   name, dpi/65536.0, numfonts, numfonts!=1 ? "s" : "");
  155. #endif /* DEBUG */
  156.                size->size    = dpi ;
  157.                size->entries = numfonts ;
  158.                size->entry   = entry ;
  159.                   for ( ;numfonts > 0; numfonts--, entry++) {
  160.                      /* read each entry */
  161.                      (void)pkquad();            /* ignore length of font */
  162.                      entry->offset = pkquad();  /* offset to font */
  163.                      len = pkbyte();            /* length of name */
  164.                      for (i=0; i<len; i++)
  165.                         fontname[i] = pkbyte();
  166.                      fontname[len] = '\0';
  167.                      entry->name = newstring(fontname);
  168.                   } /* end for numfonts>0 */
  169.             }  /* end for numsizes>0 */
  170.             /* keep font library open */
  171.          }  /* end if opened library */
  172.       } /* end if (*name) */
  173.    }
  174. }
  175.    
  176.  
  177. /*
  178.  *   flisearch searches all the font libraries for a PK font.
  179.  *   returns FILE pointer positioned to PK font in font library
  180.  */
  181. FILE *
  182. flisearch(n, dpi)
  183. char *n;
  184. halfword dpi;
  185. {
  186.    halfword dpi1, numsizes, numfonts;
  187.    struct fli_lib *lib=NULL;
  188.    struct fli_size *size;
  189.    struct fli_entry *entry;
  190.    int del ;
  191.    
  192.    if (firstlib == (struct fli_lib *)NULL)
  193.       return((FILE *)NULL);  /* return if no font libraries */
  194.  
  195. #ifdef DEBUG
  196.       if (dd(D_FONTS))
  197.          (void)fprintf(stderr,"Trying %s at %ddpi\n", n, dpi);
  198. #endif /* DEBUG */
  199.    for (lib = firstlib; lib != (struct fli_lib *)NULL; lib = lib->next ) {
  200.       /* for each font library */
  201.       numsizes = lib->sizes ;
  202.       size = lib->size ;
  203. #ifdef DEBUG
  204.       if (dd(D_FONTS))
  205.          (void)fprintf(stderr,"  Searching %s\n", lib->name);
  206. #endif /* DEBUG */
  207.       for (; numsizes>0; numsizes--, size++) { 
  208.          /* for each font size in this library */
  209.          dpi1 = (halfword)((size->size+32768L)/65536) ;
  210.          if ( dpi1 == dpi ) {
  211.             /* if correct size then search for font */
  212. #ifdef DEBUG
  213.             if (dd(D_FONTS))
  214.                (void)fprintf(stderr, "    Checking size %ddpi\n",dpi1);
  215. #endif /* DEBUG */
  216.             entry = size->entry ;
  217.             for (numfonts=size->entries ;numfonts > 0; numfonts--, entry++) {
  218.                if (strcmp(entry->name,n)==0) {
  219.                   /* if correct font name then seek it */
  220.                      pkfile = lib->fp;
  221.                      flib = 1 ; /* this is a font library - don't close it */
  222.                      (void)sprintf(name,"%s %s %ddpi",lib->name, n, dpi1) ;
  223.                      if ( fseek(pkfile,entry->offset,0) )
  224.                            badpk("couldn't seek font");
  225.                         /* make sure it is a PK font */
  226.                         if (pkbyte()==247) /* pre byte */
  227.                            if (pkbyte()==89) {  /* id byte */
  228.                               if ( fseek(pkfile,entry->offset,0) )
  229.                                  badpk("couldn't seek font");
  230.                               return(pkfile); /* found it */
  231.                            }
  232.                         sprintf(errbuf,"%s %s %ddpi isn't PK format, ignoring",
  233.                               lib->name, n, dpi1);
  234.                         error(errbuf);
  235.                } /* end if name correct */
  236.             } /* end